home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / term-source.lha / CursorPanel.c < prev    next >
C/C++ Source or Header  |  1995-09-28  |  9KB  |  387 lines

  1. /*
  2. **    CursorPanel.c
  3. **
  4. **    Editing panel for cursor key configuration
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_QUALIFIER=1,GAD_UP,GAD_DOWN,GAD_RIGHT,GAD_LEFT,
  13.         GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL,GAD_DEFAULT,
  14.     };
  15.  
  16. BOOLEAN __regargs
  17. CursorPanel(struct CursorKeys *CursorKeys,STRPTR LastCursorKeys,struct Window *Parent,BYTE *ChangedPtr)
  18. {
  19.     struct CursorKeys    *Keys;
  20.     ULONG             OldCRC;
  21.     BOOLEAN             CursorKeysChanged;
  22.  
  23.     if(ChangedPtr)
  24.         CursorKeysChanged = *ChangedPtr;
  25.     else
  26.         CursorKeysChanged = FALSE;
  27.  
  28.     OldCRC = DoCRC(CursorKeys,sizeof(struct CursorKeys));
  29.  
  30.     if(Keys = (struct CursorKeys *)AllocVecPooled(sizeof(struct CursorKeys),MEMF_ANY))
  31.     {
  32.         struct LayoutHandle *Handle;
  33.  
  34.         CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  35.  
  36.         if(Handle = LT_CreateHandleTags(Window -> WScreen,
  37.             LH_LocaleHook,    &LocaleHook,
  38.         TAG_DONE))
  39.         {
  40.             struct Window *PanelWindow;
  41.  
  42.             LT_New(Handle,
  43.                 LA_Type,    VERTICAL_KIND,
  44.             TAG_DONE);
  45.             {
  46.                 LT_New(Handle,
  47.                     LA_Type,    VERTICAL_KIND,
  48.                     LA_LabelID,    MSG_V36_0029,
  49.                 TAG_DONE);
  50.                 {
  51.                     LT_New(Handle,
  52.                         LA_Type,        VERTICAL_KIND,
  53.                     TAG_DONE);
  54.                     {
  55.                         LT_New(Handle,
  56.                             LA_Type,    CYCLE_KIND,
  57.                             LA_LabelID,    MSG_MACROPANEL_KEY_MODIFIER_GAD,
  58.                             LA_ID,        GAD_QUALIFIER,
  59.                             LACY_TabKey,    TRUE,
  60.                             LACY_FirstLabel,MSG_MACROPANEL_NONE_TXT,
  61.                             LACY_LastLabel,    MSG_MACROPANEL_CONTROL_TXT,
  62.                         TAG_DONE);
  63.  
  64.                         LT_New(Handle,
  65.                             LA_Type,    XBAR_KIND,
  66.                         TAG_DONE);
  67.  
  68.                         LT_EndGroup(Handle);
  69.                     }
  70.  
  71.                     LT_New(Handle,
  72.                         LA_Type,        VERTICAL_KIND,
  73.                     TAG_DONE);
  74.                     {
  75.                         LT_New(Handle,
  76.                             LA_Type,    STRING_KIND,
  77.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_UP_GAD,
  78.                             LA_Chars,    30,
  79.                             LA_ID,        GAD_UP,
  80.                             GTST_MaxChars,    255,
  81.                         TAG_DONE);
  82.  
  83.                         LT_New(Handle,
  84.                             LA_Type,    STRING_KIND,
  85.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_DOWN_GAD,
  86.                             LA_Chars,    30,
  87.                             LA_ID,        GAD_DOWN,
  88.                             GTST_MaxChars,    255,
  89.                         TAG_DONE);
  90.  
  91.                         LT_New(Handle,
  92.                             LA_Type,    STRING_KIND,
  93.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_RIGHT_GAD,
  94.                             LA_Chars,    30,
  95.                             LA_ID,        GAD_RIGHT,
  96.                             GTST_MaxChars,    255,
  97.                         TAG_DONE);
  98.  
  99.                         LT_New(Handle,
  100.                             LA_Type,    STRING_KIND,
  101.                             LA_LabelID,    MSG_CURSORPANEL_CURSOR_LEFT_GAD,
  102.                             LA_Chars,    30,
  103.                             LA_ID,        GAD_LEFT,
  104.                             GTST_MaxChars,    255,
  105.                         TAG_DONE);
  106.  
  107.                         LT_EndGroup(Handle);
  108.                     }
  109.  
  110.                     LT_EndGroup(Handle);
  111.                 }
  112.  
  113.                 LT_New(Handle,
  114.                     LA_Type,VERTICAL_KIND,
  115.                 TAG_DONE);
  116.                 {
  117.                     LT_New(Handle,
  118.                         LA_Type,    XBAR_KIND,
  119.                         LAXB_FullSize,    TRUE,
  120.                     TAG_DONE);
  121.  
  122.                     LT_EndGroup(Handle);
  123.                 }
  124.  
  125.                 LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  126.                     LAGR_SameSize,    TRUE,
  127.                     LAGR_Spread,    TRUE,
  128.                 TAG_DONE);
  129.                 {
  130.                     LT_New(Handle,
  131.                         LA_Type,    BUTTON_KIND,
  132.                         LA_LabelID,    MSG_GLOBAL_USE_GAD,
  133.                         LA_ID,        GAD_USE,
  134.                         LABT_ReturnKey,    TRUE,
  135.                         LABT_ExtraFat,    TRUE,
  136.                     TAG_DONE);
  137.  
  138.                     LT_New(Handle,
  139.                         LA_Type,    BUTTON_KIND,
  140.                         LA_LabelID,    MSG_GLOBAL_DEFAULT_GAD,
  141.                         LA_ID,        GAD_DEFAULT,
  142.                         LABT_ExtraFat,    TRUE,
  143.                     TAG_DONE);
  144.  
  145.                     LT_New(Handle,
  146.                         LA_Type,    BUTTON_KIND,
  147.                         LA_LabelID,    MSG_GLOBAL_LOAD_GAD,
  148.                         LA_ID,        GAD_LOAD,
  149.                         LABT_ExtraFat,    TRUE,
  150.                     TAG_DONE);
  151.  
  152.                     LT_New(Handle,
  153.                         LA_Type,    BUTTON_KIND,
  154.                         LA_LabelID,    MSG_GLOBAL_SAVE_GAD,
  155.                         LA_ID,        GAD_SAVE,
  156.                         LABT_ExtraFat,    TRUE,
  157.                     TAG_DONE);
  158.  
  159.                     LT_New(Handle,
  160.                         LA_Type,    BUTTON_KIND,
  161.                         LA_LabelID,    MSG_GLOBAL_CANCEL_GAD,
  162.                         LA_ID,        GAD_CANCEL,
  163.                         LABT_EscKey,    TRUE,
  164.                         LABT_ExtraFat,    TRUE,
  165.                     TAG_DONE);
  166.  
  167.                     LT_EndGroup(Handle);
  168.                 }
  169.  
  170.                 LT_EndGroup(Handle);
  171.             }
  172.  
  173.             if(PanelWindow = LT_Build(Handle,
  174.                 LAWN_TitleID,        MSG_CURSORPANEL_CURSOR_PREFERENCES_TXT,
  175.                 LAWN_IDCMP,        IDCMP_CLOSEWINDOW,
  176.                 LAWN_HelpHook,        &GuideHook,
  177.                 LAWN_Parent,        Parent,
  178.                 WA_DepthGadget,        TRUE,
  179.                 WA_CloseGadget,        TRUE,
  180.                 WA_DragBar,        TRUE,
  181.                 WA_RMBTrap,        TRUE,
  182.                 WA_Activate,        TRUE,
  183.                 WA_SimpleRefresh,    TRUE,
  184.             TAG_DONE))
  185.             {
  186.                 struct IntuiMessage    *Message;
  187.                 BOOLEAN             Done = FALSE;
  188.                 ULONG             MsgClass;
  189.                 UWORD             MsgCode;
  190.                 struct Gadget        *MsgGadget;
  191.                 UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  192.                             *DummyChar;
  193.                 struct FileRequester    *FileRequest;
  194.                 LONG             Modifier = 0,i;
  195.  
  196.                 GuideContext(CONTEXT_CURSOR);
  197.  
  198.                 PushWindow(PanelWindow);
  199.  
  200.                 LT_ShowWindow(Handle,TRUE);
  201.  
  202.                 for(i = 0 ; i < 4 ; i++)
  203.                 {
  204.                     LT_SetAttributes(Handle,GAD_UP + i,
  205.                         GTST_String,Keys -> Keys[Modifier][i],
  206.                     TAG_DONE);
  207.                 }
  208.  
  209.                 do
  210.                 {
  211.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  212.                     {
  213.                         CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  214.  
  215.                         break;
  216.                     }
  217.  
  218.                     while(Message = (struct IntuiMessage *)LT_GetIMsg(Handle))
  219.                     {
  220.                         MsgClass    = Message -> Class;
  221.                         MsgCode        = Message -> Code;
  222.                         MsgGadget    = (struct Gadget *)Message -> IAddress;
  223.  
  224.                         LT_ReplyIMsg(Message);
  225.  
  226.                         if(MsgClass == IDCMP_CLOSEWINDOW)
  227.                         {
  228.                             CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  229.  
  230.                             Done = TRUE;
  231.                         }
  232.  
  233.                         if(MsgClass == IDCMP_GADGETUP)
  234.                         {
  235.                             switch(MsgGadget -> GadgetID)
  236.                             {
  237.                                 case GAD_DEFAULT:
  238.  
  239.                                     ResetCursorKeys(Keys);
  240.  
  241.                                     for(i = 0 ; i < 4 ; i++)
  242.                                     {
  243.                                         LT_SetAttributes(Handle,GAD_UP + i,
  244.                                             GTST_String,Keys -> Keys[Modifier][i],
  245.                                         TAG_DONE);
  246.                                     }
  247.  
  248.                                     break;
  249.  
  250.                                 case GAD_QUALIFIER:
  251.  
  252.                                     for(i = 0 ; i < 4 ; i++)
  253.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  254.  
  255.                                     Modifier = MsgCode;
  256.  
  257.                                     for(i = 0 ; i < 4 ; i++)
  258.                                     {
  259.                                         LT_SetAttributes(Handle,GAD_UP + i,
  260.                                             GTST_String,Keys -> Keys[Modifier][i],
  261.                                         TAG_DONE);
  262.                                     }
  263.  
  264.                                     break;
  265.  
  266.                                 case GAD_USE:
  267.  
  268.                                     for(i = 0 ; i < 4 ; i++)
  269.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  270.  
  271.                                     if(OldCRC != DoCRC(CursorKeys,sizeof(struct CursorKeys)))
  272.                                     {
  273.                                         CopyMem(Keys,CursorKeys,sizeof(struct CursorKeys));
  274.  
  275.                                         CursorKeysChanged = TRUE;
  276.                                     }
  277.                                     else
  278.                                         CursorKeysChanged = FALSE;
  279.  
  280.                                     Done = TRUE;
  281.                                     break;
  282.  
  283.                                 case GAD_CANCEL:
  284.  
  285.                                     CopyMem(CursorKeys,Keys,sizeof(struct CursorKeys));
  286.  
  287.                                     CursorKeysChanged = FALSE;
  288.  
  289.                                     Done = TRUE;
  290.                                     break;
  291.  
  292.                                 case GAD_LOAD:
  293.  
  294.                                     strcpy(DummyBuffer,LastCursorKeys);
  295.  
  296.                                     DummyChar = PathPart(DummyBuffer);
  297.  
  298.                                     *DummyChar = 0;
  299.  
  300.                                     LT_LockWindow(PanelWindow);
  301.  
  302.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_LOAD_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  303.                                     {
  304.                                         if(!ReadIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  305.                                             ShowError(PanelWindow,ERR_LOAD_ERROR,IoErr(),DummyBuffer);
  306.                                         else
  307.                                         {
  308.                                             OldCRC = DoCRC(CursorKeys,sizeof(struct CursorKeys));
  309.  
  310.                                             CursorKeysChanged = FALSE;
  311.  
  312.                                             if(ChangedPtr)
  313.                                                 *ChangedPtr = FALSE;
  314.  
  315.                                             strcpy(Config -> CursorFileName,DummyBuffer);
  316.  
  317.                                             strcpy(LastCursorKeys,DummyBuffer);
  318.  
  319.                                             for(i = 0 ; i < 4 ; i++)
  320.                                             {
  321.                                                 LT_SetAttributes(Handle,GAD_UP + i,
  322.                                                     GTST_String,Keys -> Keys[Modifier][i],
  323.                                                 TAG_DONE);
  324.                                             }
  325.                                         }
  326.  
  327.                                         FreeAslRequest(FileRequest);
  328.                                     }
  329.  
  330.                                     LT_UnlockWindow(PanelWindow);
  331.  
  332.                                     break;
  333.  
  334.                                 case GAD_SAVE:
  335.  
  336.                                     strcpy(DummyBuffer,LastCursorKeys);
  337.  
  338.                                     DummyChar = PathPart(DummyBuffer);
  339.  
  340.                                     *DummyChar = 0;
  341.  
  342.                                     LT_LockWindow(PanelWindow);
  343.  
  344.                                     for(i = 0 ; i < 4 ; i++)
  345.                                         strcpy(Keys -> Keys[Modifier][i],(STRPTR)LT_GetAttributes(Handle,GAD_UP + i,TAG_DONE));
  346.  
  347.                                     if(FileRequest = GetFile(PanelWindow,LocaleString(MSG_CURSORPANEL_SAVE_CURSOR_KEYS_TXT),DummyBuffer,FilePart(LastCursorKeys),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  348.                                     {
  349.                                         if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct CursorKeys),ID_KEYS))
  350.                                             ShowError(PanelWindow,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
  351.                                         else
  352.                                         {
  353.                                             strcpy(LastCursorKeys,DummyBuffer);
  354.  
  355.                                             CursorKeysChanged = FALSE;
  356.  
  357.                                             if(ChangedPtr)
  358.                                                 *ChangedPtr = FALSE;
  359.                                         }
  360.  
  361.                                         FreeAslRequest(FileRequest);
  362.                                     }
  363.  
  364.                                     LT_UnlockWindow(PanelWindow);
  365.  
  366.                                     break;
  367.                             }
  368.                         }
  369.                     }
  370.                 }
  371.                 while(!Done);
  372.  
  373.                 PopWindow();
  374.             }
  375.  
  376.             LT_DeleteHandle(Handle);
  377.         }
  378.  
  379.         FreeVecPooled(Keys);
  380.     }
  381.  
  382.     if(ChangedPtr)
  383.         *ChangedPtr |= CursorKeysChanged;
  384.  
  385.     return(CursorKeysChanged);
  386. }
  387.